﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ASPLanchonete.fabrica;
using NHibernate;
using ASPLanchonete.classes;
using NHibernate.Linq;

namespace ASPLanchonete.controller
{
    public class ProdutoController : IProdutoController
    {
        Fabrica fabrica = new Fabrica();
        public string Salvar(Produto produto)
        {
            produto.Producao = false;
            return fabrica.Salva(produto);
        }

        public string SalvarProducao(Producao producao)
        {
            return fabrica.SalvaProducao(producao);
        }

        public IList<Produto> Recuperar()
        {
            ISession sessao = fabrica.sessao();
            IList<Produto> produto = sessao.CreateCriteria<Produto>().List<Produto>();
            fabrica.fechaSessao();
            return produto;
        }

        public Produto PesquisarPorId(int id)
        {
            ISession sessao = fabrica.sessao();
            Produto produto = sessao.Query<Produto>().Where(a => a.Id == id).Fetch(a => a.CategoriaProduto).FirstOrDefault();
            fabrica.fechaSessao();
            return produto;
        }


        public Produto PerquisarPorCodigo(double codigo)
        {
            ISession sessao = fabrica.sessao();
            Produto produto = sessao.Query<Produto>().Where(a => a.CodigoBarra == codigo).Fetch(a => a.CategoriaProduto).Fetch(a => a.TipoProduto).FirstOrDefault();
            if (produto != null && produto.ListaItemProducao != null && produto.ListaProducao != null)
            {
                produto.ListaItemProducao = null;
                produto.ListaProducao = null;
            }
            fabrica.fechaSessao();
            return produto;
        }

        public IList<Produto> RecuperarNaoInsumo(int idSelecionado = 0)
        {
            ISession sessao = fabrica.sessao();
            IList<Produto> produtos = sessao.Query<Produto>().Where(a => a.Id != idSelecionado && a.ListaProducao.Count == 0).ToList();
            fabrica.fechaSessao();
            return produtos;
        }

        public IList<Produto> RecuperarNaoProducao()
        {
            ISession sessao = fabrica.sessao();
            IList<Produto> produtos = sessao.Query<Produto>().Where(a => a.ListaProducao.Count == 0).ToList();
            fabrica.fechaSessao();
            return produtos;
        }


        public IList<Produto> RecuperarNaoInsumoAtualiza(List<int> listaAdicionados, int idSelecionado)
        {
            List<Produto> listaRetorno = new List<Produto>();
            if (listaAdicionados != null && listaAdicionados.Count > 0 && idSelecionado != 0)
            {
                listaRetorno = RecuperarNaoInsumo(idSelecionado).ToList();

                foreach (int id in listaAdicionados)
                {
                    Produto item = listaRetorno.Where(a => a.Id == id).FirstOrDefault();
                    if (item != null)
                    {
                        listaRetorno.Remove(item);
                    }
                }
            }
            return listaRetorno;
        }

        public Producao PesquisaPorIdProducao(int id)
        {
            ISession sessao = fabrica.sessao();
            Producao producao = sessao.Query<Producao>().Where(a => a.Id == id).Fetch(a => a.Produto).FirstOrDefault();
            IList<ItemProducao> listaItemProducao = sessao.Query<ItemProducao>().Where(a => a.IdProducao == id).Fetch(a => a.Produto).ToList();
            producao.ListaItemProducao = listaItemProducao;
            fabrica.fechaSessao();
            return producao;
        }
    }
}